/*
  Programa GEFE - Gestión de eventos lúdicos.
  Copyright (C) 2010  Antonio Ramírez Marti

  This program is free software: you can redistribute it and/or modify
  it under the terms of the GNU General Public License as published by
  the Free Software Foundation, either version 3 of the License, or
  (at your option) any later version.

  This program is distributed in the hope that it will be useful,
  but WITHOUT ANY WARRANTY; without even the implied warranty of
  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  GNU General Public License for more details.

  You should have received a copy of the GNU General Public License
  along with this program.  If not, see <http://www.gnu.org/licenses/>.
*/

#include "acolitowindow.h"
#include "ui_acolitowindow.h"

#include <QMessageBox>
#include <QSqlError>
#include <QDebug>
#include <QSettings>
#include <QAction>

acolitoWindow::acolitoWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::acolitoWindow)
{
    ui->setupUi(this);
    setup();
    emit pregunta();
}

acolitoWindow::~acolitoWindow()
{
    delete ui;
}

void acolitoWindow::changeEvent(QEvent *e)
{
    QMainWindow::changeEvent(e);
    switch (e->type()) {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;
    }
}

void acolitoWindow::closeEvent(QEvent *e)
{
    if(this->getEstado()==AcolitoEvento::Conectado)
    {
        emit this->conectarAcolitos(false);
        delete this->paginaActividades;
        delete this->generadorFichas;
        QSqlDatabase::database("evento").close();
        QSqlDatabase::removeDatabase("evento");
    }
    e->accept();
}

void acolitoWindow::setup()
{

    this->paginaActividades= new AcolitoActividades(this);
    this->generadorFichas= new FichaActividad(this);
    this->gestorEventos=new AcolitoEvento(this);

    this->mapperEventos=new QSignalMapper(this);


    this->setCentralWidget(paginaActividades);

    setEstado(AcolitoEvento::Desconectado);

    connect(gestorEventos,SIGNAL(solicitarEstado(bool)),this,SIGNAL(conectarAcolitos(bool)));
    connect(gestorEventos,SIGNAL(cambiarNombre(QString)),this,SLOT(setWindowTitle(QString)));

    connect(this,SIGNAL(conectarAcolitos(bool)),this->paginaActividades,SLOT(setConectado(bool)));
    connect(this,SIGNAL(conectarAcolitos(bool)),this->generadorFichas,SLOT(conecta(bool)));
    connect(this,SIGNAL(conectarAcolitos(bool)),this,SLOT(activaAcciones(bool)));

    connect(this->paginaActividades,SIGNAL(solicitudListaFichas(QSqlQuery,QString)),generadorFichas,SLOT(generaFichasSeleccionadas(QSqlQuery,QString)));
    connect(this->paginaActividades,SIGNAL(solicitudListaSala(QSqlQuery,QString,QString)),this->generadorFichas,SLOT(generaFichaSala(QSqlQuery,QString,QString)));
    connect(this->paginaActividades,SIGNAL(solicitudImprimeFicha(QSqlRecord)),this->generadorFichas,SLOT(imprimeFichaActividad(QSqlRecord)));
    connect(this->paginaActividades,SIGNAL(solicitudImprimeSala(QSqlQuery,QString,QPrinter*)),generadorFichas,SLOT(generaImprimeFichaSala(QSqlQuery,QString,QPrinter*)));

    setupVentanaPrincipal();
    setupGruposAcciones();
    conectaAcciones();

    connect(this,SIGNAL(pregunta()),this,SLOT(abrirUltimoEvento()));

}

void acolitoWindow::conectaAcciones()
{
    connect(ui->actionCrearEvento,SIGNAL(triggered()),this->gestorEventos,SLOT(solicitaNuevoEvento()));
    connect(ui->actionAbrirEvento,SIGNAL(triggered()),gestorEventos,SLOT(solicitaAbrirEvento()));
    connect(ui->actionNueva_actividad,SIGNAL(triggered()),this->paginaActividades,SLOT(nuevasActividadesDialog()));
    connect(this,SIGNAL(abrirArchivoEvento(QString)),gestorEventos,SLOT(abreEvento(QString)));
    connect(ui->actionSobre_Qt,SIGNAL(triggered()),this,SLOT(sobreQt()));
    connect(ui->actionSobre_el_Acolito,SIGNAL(triggered()),this,SLOT(sobreAcolito()));
    connect(ui->actionInforme,SIGNAL(triggered()),this,SLOT(mostrarDatosGenerales()));
    connect(ui->actionGenerar_fichas_del_dia,SIGNAL(triggered()),this->paginaActividades,SLOT(fichasDelDiaDialog()));

    connect(this->paginaActividades,SIGNAL(solicitudFicha(QSqlRecord)),this->generadorFichas,SLOT(generaFichaActividad(QSqlRecord)));
    connect(this->paginaActividades,SIGNAL(solicitudImprimeListaFichas(QSqlQuery)),this->generadorFichas,SLOT(generaImprimeFichasDia(QSqlQuery)));
}

void acolitoWindow::setupGruposAcciones()
{
    //Crear grupos
    this->accionesActividades=new QActionGroup(this);

    //Grupo de acciones de actividades

    accionesActividades->addAction(ui->actionNueva_actividad);
    accionesActividades->addAction(ui->actionGenerar_fichas_del_dia);

}

void acolitoWindow::setupVentanaPrincipal()
{
    QAction *event;
    QSettings settings("ARM","Acolito");
    QPair<QString,QString> evento;
    int j=0;

    this->separadorAcciones=ui->menuPrincipal->addSeparator();
    this->actionLimpiar_evento=new QAction("Limpiar eventos recientes",this);

    for(int i=1;i<=MAX_EVENTOS;i++)
        accionesEventos.append(new QAction(QString("&%1 %2").arg(i),this));

    foreach(event,accionesEventos)
        event->setVisible(false);

    this->separadorAcciones->setVisible(false);

    ui->menuPrincipal->addActions(accionesEventos);
    ui->menuPrincipal->addSeparator();
    ui->menuPrincipal->addAction(actionLimpiar_evento);
    ui->menuPrincipal->addAction(ui->action_Salir);

    settings.beginReadArray("eventos");

    for(int i=0;i<MAX_EVENTOS;i++)
    {
        settings.setArrayIndex(i);
        evento.first=settings.value("nombre").toString();
        evento.second=settings.value("archivo").toString();
        this->eventosRecientes.append(evento);
    }
    settings.endArray();

    foreach(evento,eventosRecientes)
    {
        if(!evento.first.isEmpty() && !evento.first.isNull())
        {
            this->separadorAcciones->setVisible(true);
            accionesEventos[j]->setText(QString("&%1 %2").arg(j+1).arg(evento.first));
            accionesEventos[j]->setData(evento.second);

            connect(accionesEventos[j],SIGNAL(triggered()),this,SLOT(abreEventoReciente()));
            accionesEventos[j++]->setVisible(true);
        }
    }

    connect(gestorEventos,SIGNAL(eventoAbierto(QPair<QString,QString>)),this,SLOT(addListaEvento(QPair<QString,QString>)));
    connect(this,SIGNAL(abrirArchivoEvento(QString)),gestorEventos,SLOT(abreEvento(QString)));
    connect(actionLimpiar_evento,SIGNAL(triggered()),this,SLOT(limpiarEventosRecientes()));
}

void acolitoWindow::sobreQt()
{
    QMessageBox::aboutQt(this,"Sobre Qt 4");
}

void acolitoWindow::sobreAcolito()
{
    QMessageBox::about(this,"Programa Acolito","AcolitoLite - Gestor de Eventos simplificado, unicamente con la gestion de actividades, parte del Proyecto GEFE.\n\nCopyright Antonio Ramírez Marti, 2010.\n\nLicenciado bajo GPL v3.");
}

void acolitoWindow::mostrarDatosGenerales()
{
    AcolitoInforme *datosGenerales=new AcolitoInforme(this);

    datosGenerales->exec();

    delete datosGenerales;
}


void acolitoWindow::activaAcciones(bool estado)
{
    ui->actionInforme->setEnabled(estado);
    ui->actionNueva_actividad->setEnabled(estado);
    ui->actionGenerar_fichas_del_dia->setEnabled(estado);
}

void acolitoWindow::addListaEvento(QPair<QString, QString> evento)
{
    QPair<QString,QString> entrada;
    int i=0;

    if(!eventosRecientes.isEmpty())
    {
        this->eventosRecientes.removeAll(evento);
        this->eventosRecientes.prepend(evento);
    }
    else
        this->eventosRecientes.append(evento);

    foreach(entrada,eventosRecientes)
    {
        if(!entrada.first.isEmpty() && i<MAX_EVENTOS)
        {
            this->separadorAcciones->setVisible(true);
            accionesEventos[i]->setText(QString("&%1 %2").arg(i+1).arg(entrada.first));
            accionesEventos[i]->setData(entrada.second);
            accionesEventos[i++]->setVisible(true);
        }
    }

    QSettings settings("ARM","Acolito");
    settings.beginWriteArray("eventos");
    for(i=0;i<MAX_EVENTOS;i++)
    {
        settings.setArrayIndex(i);
        settings.setValue("nombre",eventosRecientes[i].first);
        settings.setValue("archivo",eventosRecientes[i].second);
    }
    settings.endArray();

}

void acolitoWindow::abreEventoReciente()
{
    QAction *evento=qobject_cast<QAction*>(QObject::sender());
    QString archivo=evento->data().toString();

    emit this->abrirArchivoEvento(archivo);
}

void acolitoWindow::limpiarEventosRecientes()
{
    QSettings settings("ARM","Acolito");
    QAction *entradaMenu;
    QPair<QString,QString> entradaEventos;

    settings.beginWriteArray("eventos");
    for(int i=0;i<MAX_EVENTOS;i++)
    {
        settings.setArrayIndex(i);
        settings.setValue("nombre",QString());
        settings.setValue("archivo",QString());
    }

    foreach(entradaMenu,accionesEventos)
        entradaMenu->setVisible(false);

    this->separadorAcciones->setVisible(false);
    foreach(entradaEventos,eventosRecientes)
    {
        entradaEventos.first=QString();
        entradaEventos.second=QString();
    }
}

void acolitoWindow::abrirUltimoEvento()
{
    if(!eventosRecientes[0].first.isEmpty())
    {
        int opcion=QMessageBox::question(this,"Acolito","El ultimo evento abierto fue:\n"+eventosRecientes[0].first+"\n\nDesea abrir el ultimo evento?",QMessageBox::Yes,QMessageBox::No);

        if(opcion==QMessageBox::Yes)
            emit this->abrirArchivoEvento(eventosRecientes[0].second);
    }
}
